在comp.lang.c ++。moderated上阅读了C ++ / STL的“隐藏功能”和“黑暗角落”之后,我完全惊讶于以下代码段在Visual Studio 2008和G ++ 4.4中都可以编译并正常工作。 这是代码: #includeint main() { 整数x = 10; while(x-> 0)// x变为0 { printf(“%d”,x); } } 输出: 9 8 7 6 5 4 3 2 1 0 我认为这是C,因为它也可以在GCC中使用。该标准在哪里定义,以及它来自何处?
->不是运算符。实际上,它是两个单独的运算符,-和>。 条件代码将x递减,同时返回x的原始(未递减)值,然后使用>运算符将原始值与0比较。 为了更好地理解,该语句可以编写如下: while((x--)> 0) | 或者对于完全不同的东西... x滑到0。 而(x-\ \ \ \ > 0) printf(“%d”,x); 并不是那么数学,但是...每张画都画一千个字... | 这是一个非常复杂的运算符,因此即使是ISO / IEC JTC1(联合技术委员会1)也将其说明放在C ++标准的两个不同部分中。 除了开玩笑,它们是两个不同的运算符:-和>分别在C ++ 03标准的5.2.6 / 2和5.9节中进行了描述。 | 相当于 而(x--> 0) x--(后减量)等效于x = x-1,因此代码转换为: while(x> 0){ x = x-1; //逻辑 } X - ; //当x <= 0时完成后递减 | x可以在相反的方向更快地变为零: 整数x = 10; 而(0 <---- x) { printf(“%d”,x); } 8 6 4 2 您可以用箭头控制速度! 整数x = 100; while(0 <-------------------- x) { printf(“%d”,x); } 90 80 70 60 50 40 30 20 10 ;) | 它的 #includeint main(void){ 整数x = 10; while(x--> 0){// x变为0 printf(“%d”,x); } 返回0; } 只是空间使事情看起来很有趣,即递减并进行比较。 | ->的用法具有历史意义。减少(在某些情况下仍然是)比在x86架构上增加要快。使用->表示x将为0,并且吸引那些具有数学背景的人。 | 而(x--> 0) 是这样解析的。 | 极客,但我会用这个: #定义为; int main(int argc,char * argv []) { int n = atoi(argv [1]); 将printf(“ n为%d \ n”,n)做为(n-> 0); 返回0; } | 我读过的一本书(我不记得是哪本书)说:编译器尝试使用左右规则将表达式解析为最大标记。 在这种情况下,表达式为: x-> 0 解析为最大令牌: 令牌1:x 令牌2:- 令牌3:> 令牌4:0 结论:x--> 0 相同的规则适用于此表达式: a ----- b 解析后: 令牌1: 令牌2:- 令牌3:- 令牌4:- 令牌5:b 结论:(a-)--b 我希望这有助于理解复杂的表达方式^^ | 这与 而(x--) { printf(“%d”,x); } 对于非负数 | 无论如何,我们现在有一个“转到”运算符。容易记住“->”是一个方向,“ x趋于零时”是直截了当的。 此外,它在某些平台上比“ for(x = 10; x> 0; x-)”有效。 | 此代码首先将x与0比较,然后将x减1。 (也请在第一个答案中说:先递减x,然后将x和0与>运算符进行比较。)请参见以下代码的输出: 9 8 7 6 5 4 3 2 1 0 现在,我们首先进行比较,然后通过在输出中看到0来递减。 如果我们要先递减然后比较,请使用以下代码: #include int main(无效) { 整数x = 10; while(--x> 0)// x变为0 { printf(“%d”,x); } 返回0; } 该输出是: 9 8 7 6 5 4 3 2 1 | 运行此代码时,我的编译器将打印出9876543210。 #include int main() { 整数x = 10; while(x-> 0)// x变为0 { std :: cout << x; } } 如预期的那样。 while(x--> 0)实际上意味着while(x> 0)。 x--后减x。 而(x> 0) { X - ; std :: cout << x; } 是写同一件事的另一种方式。 很好的是,原来看起来像“而x变为0”。 | -和>之间缺少空格。 x是递减的,也就是说,在检查条件x> 0?之后递减。 | -是减量运算符,而>是大于运算符。 这两个运算符像->一样应用为一个。 | 它是两个运算符的组合。首先-用于减小值,而>用于检查该值是否大于右侧操作数。 #include int main() { 整数x = 10; 而(x--> 0) printf(“%d”,x); 返回0; } 输出将是: 9 8 7 6 5 4 3 2 1 0 | 实际上,x是递减的,并且正在检查该条件。不是->(x--)> 0 注意:检查条件后,x的值会更改,因为它会递减。也会发生一些类似的情况,例如: -> x-> 0 ++> x ++> 0 -> = x-> = 0 ++> = x ++> = 0 | C和C ++遵循“最大嚼数”规则。将a --- b转换为(a--)-b的方法相同,在您的情况下,x-> 0转换为(x-)> 0。 规则本质上是说,从左到右,表达式是通过采用将构成有效表达式的最大字符组成的。 | 为什么所有的并发症? 原始问题的简单答案是: #include int main() { 整数x = 10; 而(x>0) { printf(“%d”,x); x = x-1; } } 它做同样的事情。我并不是说您应该这样做,但是它做同样的事情,并且会在一篇文章中回答该问题。 x--只是上述的简写,而>只是普通的大于运算符。没什么大不了的! 如今有太多人使简单的事情变得复杂;) | 以常规方式,我们将在while循环括号()中定义一个条件,并在括号{}中定义一个终止条件,但是->会同时定义两者。 例如: int abc(无效) { 整数a = 5 while(((a--)> 0)//同时减少和比较 { //代码 } } 这将使a减小并在a大于0时运行循环。 按照惯例,它将是: int abc(无效) { 整数= 5; 而(a> 0) { 一种 - ; //代码 } 一种 - ; } 两种方式,我们都做相同的事情,实现相同的目标。 | (x-> 0)表示(x--> 0)。 您可以使用(x->)输出:9 8 7 6 5 4 3 2 1 0 您可以使用(-x> 0)表示(--x> 0)输出:9 8 7 6 5 4 3 2 1 您可以使用 (- \ x> 0) 输出:9 8 7 6 5 4 3 2 1 您可以使用 (\ \ x-> 0) 输出:9 8 7 6 5 4 3 2 1 0 您可以使用 (\ \ x-> 0 \ \ ) 输出:9 8 7 6 5 4 3 2 1 0 您也可以使用 ( X -> ) 输出:9 8 7 6 5 4 3 2 1 0 同样,您可以尝试许多方法来成功执行此命令。 | 这是一元后递减运算符。 while(x--> 0)// x变为0 { printf(“%d”,x); } 在开始时,条件将评估为 (x> 0)// 10> 0 现在因为条件为真,它将以减小的值进入循环 x-- // x = 9 这就是为什么第一个打印值是9 等等。在最后一个循环中x = 1,因此条件为true。按照一元运算符,在打印时该值变为x = 0。 现在,x = 0,它将条件(x> 0)评估为false,而while循环退出。 | ->根本不是运算符。我们有一个类似于->的运算符,但不像->那样。这只是对while(x--> 0)的错误解释,这仅意味着x具有后减量运算符,并且此循环将一直运行到大于零为止。 编写此代码的另一种简单方法是while(x--)。 while循环将在出现错误条件时停止,并且这里只有一种情况,即0。因此,当x值减小到零时,它将停止。 | 高度活跃的问题。赢得10个声誉才能回答这个问题。信誉要求有助于保护该问题免受垃圾邮件和非答复活动的侵害。 不是您要找的答案?浏览标记为c ++ c运算符代码格式符合标准的其他问题,或询问您自己的问题。